package com.niit.scala

object Base_05 {

    //1.继承
  // 父类
 class Person{
      var name:String = _
      var age:Int = _

      def eat(food:String)=println(s"${name}在吃${food}")
    }
  //子类 继承于 Person
  class Teacher extends Person{

    //默认有一个eat方法

    //当前子类特有的方法
    def teach()=println(s"${name}老师在教课")
  }
  //子类 继承于Person
  class Student extends Person{
    //默认有一个eat方法

    //当前子类特有的方法
    def study()=println(s"${name}学生在学习")
  }

  //2.抽象： abstract定义抽象类 拥有抽象的方法和字段
  abstract class Shape{
    //定义一个抽象方法 抽象方法是没有方法体
    def area:Double
  }
  //正方形
  class Square(var edge:Double) extends Shape{
    //继承于抽象类后，那么子类一定要重写父类中的抽象方法，要写具体的方法体
    override def area: Double = {
      edge * edge
    }
  }
  //长方形
  class Rectangle(var length:Double,var width:Double) extends Shape{
    override def area: Double = length * width
  }

  /*
     特质 ：就是Java中的接口
     特点：
      特质可以提高代码的复用性
      特质可以提供代码的扩展性和可维护性
      类和特质的是继承的关系，类与类只支持单继承，类与特质之间可以单继承也可是多继承
      Scala的特质中可以有普通字段、抽象字段、普通方法、抽象方法
      如果特质只有抽象内容也可以叫做瘦接口，如果既有抽象内容又有具体内容叫做富接口
      关键字：trait
   */
  //日志的接口
  trait Logger{
    def log(msg:String)
  }
  //文件的接口
  trait File{
    def write(msg:String,dir:String)
  }

  class ConsoleLogger extends Logger with File{

    override def log(msg: String): Unit = {

      println("当前日志信息为："+msg)

    }

    override def write(msg: String, dir: String): Unit = {

      println("输入至"+dir+",内容"+msg)

    }
  }

  /*
    样例类：是一种特殊的类，一般用于保存数据面，在后面数据分析中的并发编程上会用到
     case class 类名([var/varl 变量:类型......]){}
      变量修饰符默认是val
      定义一个样例类 People 其中 名字不可变 年龄可以改变
   */
  //类似于Java Emun
  case class People(name:String,var age:Int)


  def main(args: Array[String]): Unit = {
      val teacher = new Teacher
      teacher.name="张三"
      teacher.age = 36
      teacher.eat("烤鸭")
      teacher.teach()

      val student = new Student
      student.name = "小明"
      student.age = 22
      student.eat("麻辣烫")
      student.study()

    val square = new Square(5.5)
    println("正方形的面积："+square.area)
    val rectangle = new Rectangle(8,10)
    println("长方形的面积："+rectangle.area)

    val consoleLogger = new ConsoleLogger
    consoleLogger.log("error:IndexOfOutBounds")
    consoleLogger.write("用户张三在使用澳门博彩","/home/niit/file/user.txt")

    val people = new People("李四",22)
    println(people.name,people.age)
  }

}
